import { createRouter, createWebHistory } from 'vue-router'
import Home from '../views/Home.vue'
import Device from '../views/Device.vue'
import Analysis from '../views/Analysis.vue'
import Content from '../views/Content.vue'
import Resource from '../views/Resource.vue'
import User from '../views/User.vue'
import Feedback from '../views/Feedback.vue'
import Login from '../views/Login.vue'
import UserDetail from '../views/UserDetail.vue'
import Profile from '../views/Profile.vue'
import Admin from '../views/Admin.vue'
import AdminLogs from '../views/AdminLogs.vue'
import { isAuthenticated, getAdminLevel, hasPermission } from '../utils/auth'

// 公共路由 - 所有用户都可以访问的路由
export const constantRoutes = [
  {
    path: '/login',
    name: 'Login',
    component: Login,
    meta: { title: '登录', requiresAuth: false }
  },
  {
    path: '/403',
    name: 'NoPermission',
    component: () => import('../views/403.vue'), // 需要创建这个文件
    meta: { title: '无权限访问', requiresAuth: false }
  }
]

// 需要根据角色动态添加的路由
export const asyncRoutes = [
  {
    path: '/',
    name: 'Home',
    component: Home,
    meta: { title: '总览', requiresAuth: true, roles: [0, 1] } // 添加0级管理员权限
  },
  {
    path: '/profile',
    name: 'Profile',
    component: Profile,
    meta: { title: '个人信息', requiresAuth: true, roles: [0, 1, 2] } // 添加0级管理员权限
  },
  {
    path: '/device',
    name: 'Device',
    component: Device,
    meta: { title: '设备列表', requiresAuth: true, roles: [0, 1] } // 添加0级管理员权限
  },
  {
    path: '/analysis',
    name: 'Analysis',
    component: Analysis,
    meta: { title: '数据决策', requiresAuth: true, roles: [0, 1] } // 添加0级管理员权限
  },
  {
    path: '/content',
    name: 'Content',
    component: Content,
    meta: { title: '公告运营', requiresAuth: true, roles: [0, 1, 2] } // 添加0级管理员权限
  },
  {
    path: '/resource',
    name: 'Resource',
    component: Resource,
    meta: { title: '资源库', requiresAuth: true, roles: [0, 1] } // 添加0级管理员权限
  },
  {
    path: '/user',
    name: 'User',
    component: User,
    meta: { title: '用户列表', requiresAuth: true, roles: [0, 1] } // 添加0级管理员权限
  },
  {
    path: '/admin',
    name: 'Admin',
    component: Admin,
    meta: { title: '管理员账户', requiresAuth: true, roles: [0, 1] } // 添加0级管理员权限
  },
  {
    path: '/admin-logs',
    name: 'AdminLogs',
    component: AdminLogs,
    meta: { title: '管理员日志', requiresAuth: true, roles: [0, 1] } // 添加0级管理员权限
  },
  {
    path: '/feedback',
    name: 'Feedback',
    component: Feedback,
    meta: { title: '反馈中心', requiresAuth: true, roles: [0, 1, 2] } // 添加0级管理员权限
  },
  {
    path: '/user/:id',
    name: 'UserDetail',
    component: UserDetail,
    meta: { title: '用户详情', requiresAuth: true, roles: [0, 1] } // 添加0级管理员权限
  },
  // 匹配所有未定义路由，重定向到404页面
  { 
    path: '/:pathMatch(.*)*', 
    redirect: '/403',
    meta: { requiresAuth: false }
  }
]

// 创建路由实例 - 初始化时添加所有路由，避免刷新页面路由丢失
const createInitialRouter = () => {
  // 检查用户是否已登录以及权限级别
  let routes = [...constantRoutes];
  
  if (isAuthenticated()) {
    const adminLevel = getAdminLevel();
    if (adminLevel === 0) {
      // 0级管理员有权访问所有路由
      routes = [...constantRoutes, ...asyncRoutes];
    } else if (adminLevel) {
      // 其他管理员根据权限过滤路由
      const accessibleRoutes = filterAsyncRoutes(asyncRoutes, adminLevel);
      routes = [...constantRoutes, ...accessibleRoutes];
    }
  }
  
  return createRouter({
    history: createWebHistory(process.env.BASE_URL),
    routes,
    // 添加滚动行为以改善用户体验
    scrollBehavior(to, from, savedPosition) {
      if (savedPosition) {
        return savedPosition;
      } else {
        return { top: 0 };
      }
    }
  });
};

const router = createInitialRouter();

// 根据角色过滤路由
export function filterAsyncRoutes(routes, role) {
  const res = []
  
  routes.forEach(route => {
    const tmp = { ...route }
    // 如果route.meta存在并且route.meta.roles包含当前角色
    if (tmp.meta && tmp.meta.roles && tmp.meta.roles.includes(role)) {
      // 如果有子路由，递归过滤
      if (tmp.children) {
        tmp.children = filterAsyncRoutes(tmp.children, role)
      }
      res.push(tmp)
    }
  })
  
  return res
}

// 动态添加路由的方法
export function resetRouter() {
  // 移除所有动态添加的路由
  router.getRoutes().forEach(route => {
    if (route.name && route.name !== 'Login' && route.name !== 'NoPermission') {
      router.removeRoute(route.name);
    }
  });
  
  // 重新添加常量路由
  constantRoutes.forEach(route => {
    if (!router.hasRoute(route.name)) {
      router.addRoute(route);
    }
  });
}

// 全局前置守卫
router.beforeEach(async (to, from, next) => {
  // 检查用户是否已认证
  const authenticated = isAuthenticated();
  const adminLevel = getAdminLevel();
  console.log('路由守卫: 认证状态:', authenticated);
  console.log('路由守卫: 访问路径:', to.path);
  console.log('路由守卫: 管理员级别:', adminLevel);
  
  // 如果用户未认证且访问的不是登录页或无权限页面
  if (!authenticated && to.name !== 'Login' && to.name !== 'NoPermission') {
    // 重定向到登录页面，保存原始目标路径
    console.log('路由守卫: 未认证，重定向到登录页');
    next({
      path: '/login',
      query: { redirect: to.fullPath !== '/' ? to.fullPath : undefined }
    });
    return;
  }
  
  // 如果用户已认证且尝试访问登录页
  if (authenticated && to.name === 'Login') {
    // 如果已登录且访问登录页，重定向到首页或个人信息页
    const adminLevel = getAdminLevel();
    console.log('路由守卫: 已登录用户访问登录页，重定向');
    console.log('路由守卫: 用户级别:', adminLevel);
    
    if (adminLevel === 0 || adminLevel === 1) {
      next({ name: 'Home' });
    } else {
      // 低级管理员默认跳转到个人信息页
      next({ name: 'Profile' });
    }
    return;
  }
  
  // 如果路由找不到匹配项但用户已认证，可能是刷新导致的路由丢失
  if (authenticated && to.matched.length === 0) {
    console.log('路由守卫: 找不到匹配路由，尝试重新添加路由');
    // 从异步路由中查找匹配的路由并添加
    const adminLevel = getAdminLevel();
    
    if (adminLevel === 0) {
      console.log('路由守卫: 0级管理员，添加所有路由');
      // 0级管理员添加所有路由
      asyncRoutes.forEach(route => {
        if (!router.hasRoute(route.name)) {
          router.addRoute(route);
        }
      });
    } else {
      console.log('路由守卫: 非0级管理员，添加过滤后的路由');
      // 其他管理员根据权限过滤路由
      const accessibleRoutes = filterAsyncRoutes(asyncRoutes, adminLevel);
      // 添加路由
      accessibleRoutes.forEach(route => {
        if (!router.hasRoute(route.name)) {
          router.addRoute(route);
        }
      });
    }
    
    // 重新尝试导航到目标
    // replace: true 表示导航将不会留下历史记录
    next({ ...to, replace: true });
    return;
  }
  
  // 如果用户已认证且访问的是需要特定权限的页面
  if (authenticated && to.meta.requiresAuth && to.meta.roles) {
    // 检查用户是否有权限访问该页面
    const hasAccess = hasPermission(to.meta.roles);
    console.log('路由守卫: 权限检查:', to.path, hasAccess);
    
    if (!hasAccess) {
      console.log('路由守卫: 没有权限访问:', to.path);
      // 没有权限，重定向到403页面
      next({ name: 'NoPermission' });
      return;
    }
  }
  
  // 其他情况，允许访问
  console.log('路由守卫: 允许访问', to.path);
  next();
});

export default router